package com.bingo.generate.comm.service;

import com.bingo.generate.comm.dto.DbTableDto;
import com.bingo.generate.comm.dto.ExcelDto;
import com.bingo.generate.comm.dto.TableColumnDto;
import com.bingo.generate.comm.entity.ColInfo;
import com.bingo.generate.comm.entity.TableInfo;
import com.bingo.generate.comm.util.ExcelUtil;
import com.bingo.generate.comm.util.FileUtils;
import org.apache.poi.hssf.usermodel.*;
import org.springframework.util.StringUtils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.util.List;

/**
 * ClassName
 * Description
 * Create by lc
 * Date 2021/9/23 16:52
 */
public class ExcelService {

//    /**
//     * 创建多表结构
//     *
//     * @author liusonglin
//     * @date 2018年7月25日
//     * @param ColInfos
//     * @param ColInfoDto
//     */
//
//    public void createColInfoExcel(Map<String, List<ColInfo>> map, ColInfoDto ColInfoDto)
//            throws Exception {
//        if(StringUtils.isEmpty(ColInfoDto.getExcelFileName())) {
//            throw new Exception("未输入导出文件名");
//        }else {
//            File desktopDir = FileSystemView.getFileSystemView() .getHomeDirectory();
//            ColInfoDto.setExcelFileName(desktopDir+"/"+ColInfoDto.getExcelFileName()+".xls");
//        }
//
//        // 第一步，创建一个HSSFWorkbook，对应一个Excel文件
//        HSSFWorkbook wb = new HSSFWorkbook();
//
//        // 第二步，在workbook中添加一个sheet,对应Excel文件中的sheet
//        HSSFSheet sheet = wb.createSheet(ColInfoDto.getSheetName());
//        sheet.setDefaultColumnWidth(12);
//        // 第四步，创建单元格，并设置值表头 设置表头居中
//        HSSFCellStyle style = wb.createCellStyle();
//        style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
//
//        // 声明列对象
//        HSSFCell cell = null;
//
//        HSSFRow row = sheet.createRow(0);
//        row.setHeight((short) 450);// 设置行高
//        cell = row.createCell(4);
//        cell.setCellValue(ColInfoDto.getDataSourceName() + "数据库所有表的表结构");
//        cell.setCellStyle(style);
//
//        // POI导出EXCEL设置跨行跨列（在所有数据行和列创建完成后再执行）
//        CellRangeAddress range = new CellRangeAddress(0, 0, 4, 6);
//        sheet.addMergedRegion(range);
//
//        // 数据处理
//        // logger.info(sheet.getLastRowNum());
//        // row = sheet.createRow(sheet.getLastRowNum()+3);//向下偏移3行
//        String[][] content = null;
//        Set<String> keySet = map.keySet();
//        for (String key : keySet) {
//
//            row = sheet.createRow(sheet.getLastRowNum() + 2);// 向下偏移2行
//            row.createCell(2).setCellValue("表名：" + key);
//            row = sheet.createRow(sheet.getLastRowNum() + 1);// 向下偏移1行
//            // 创建标题
//            for (int i = 0; i < ColInfoDto.getExcelTitle().length; i++) {
//                cell = row.createCell(i + 2);// 单元格从第二列开始
//                cell.setCellValue(ColInfoDto.getExcelTitle()[i]);
//                cell.setCellStyle(style);
//            }
//            List<ColInfo> ColInfos = map.get(key);
//            content = new String[ColInfos.size()][ColInfoDto.getExcelTitle().length];
//
//            // 创建内容
//            for (int i = 0; i < ColInfos.size(); i++) {
//                ColInfo ColInfo = ColInfos.get(i);
//                content[i][0] = ColInfo.getColumnName();
//                content[i][1] = ColInfo.getColumnType();
//                content[i][2] = ColInfo.getDataType();
//                content[i][3] = ColInfo.getCharacterMaximumLength();
//                content[i][4] = ColInfo.getIsNullable();
//                content[i][5] = ColInfo.getColumnDefault();
//                content[i][6] = ColInfo.getColumnComment();
//            }
//            int lastRowNum = sheet.getLastRowNum();
//            for (int i = 0; i < content.length; i++) {
//                row = sheet.createRow(i + 1 + lastRowNum);
//                for (int j = 0; j < content[i].length; j++) {
//                    // 将内容按顺序赋给对应的列对象
//                    row.createCell(j + 2).setCellValue(content[i][j]);
//                }
//            }
//        }
//
//        // 导入指定地址的Excel
//        OutputStream os = new FileOutputStream(ColInfoDto.getExcelFileName());
//        wb.write(os);
//        os.close();
//    }

    /**
     * 创建常规单表结构
     *
     * @author liusonglin
     * @date 2018年7月25日
     * @param ColInfos
     * @param ColInfoDto
     */

    public static void createSingleColInfoExcel(List<ColInfo> ColInfos, TableColumnDto ColInfoDto){
        if(StringUtils.isEmpty(ColInfoDto.getExcelPath())) {
            throw new RuntimeException("未输入导出文件名");
        }
        if(!Files.exists(ColInfoDto.getExcelPath().getParent())){
            throw new RuntimeException("文件路径不存在");
        }
        HSSFWorkbook oldWb=new HSSFWorkbook();
        oldWb = FileUtils.fnInputStream(ColInfoDto.getExcelPath(),(fis)->{
            HSSFWorkbook oldWb2=new HSSFWorkbook(fis);
            return oldWb2;
        });

        if(oldWb!=null){
            HSSFSheet sheet = oldWb.getSheet(ColInfoDto.getSheetName());
            if( sheet != null ){
                System.out.println("该sheet已经存在:"+ColInfoDto.getSheetName());
                return;
            }
        }

        String[][] content = new String[ColInfos.size()][ColInfoDto.getExcelTitle().length];

        for (int i = 0; i < ColInfos.size(); i++) {
            ColInfo ColInfo = ColInfos.get(i);
            content[i][0] = ColInfo.getColName();
            /*
            通过执行这句sql可以知道 columnType  和 dataType 的区别多大
            SELECT
                COLUMN_NAME
                columnName,
                COLUMN_TYPE columnType,
                DATA_TYPE dataType,
                CHARACTER_MAXIMUM_LENGTH characterMaximumLength,
                IS_NULLABLE
                isNullable,
                COLUMN_DEFAULT columnDefault,
                COLUMN_COMMENT
                columnComment
                FROM
                INFORMATION_SCHEMA.COLUMNS
             */
            //content[i][1] = ColInfo.getColumnType();  获取真实类型  比如
            content[i][1] = ColInfo.getColType();
            content[i][2] = ColInfo.getType();
            //content[i][3] = ColInfo.getCharacterMaximumLength();//  获取长度
            content[i][3] = "长度未知";
            {
                String res = ColInfo.getIsNullable();
                if(res.equals("YES")){
                    content[i][4]="是";
                }else{
                    content[i][4]="否";
                }
            }
            content[i][5] = ColInfo.getDefaultVal();
            content[i][6] = ColInfo.getComment();
        }

        // 创建HSSFWorkbook
        HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook( ColInfoDto.getSheetName(), ColInfoDto.getExcelTitle(),
                content, oldWb );

        // 响应到客户端
        try {
            OutputStream os = new FileOutputStream(ColInfoDto.getExcelPath().toFile());
            wb.write(os);
            os.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        System.out.println("输出路径成功:"+ColInfoDto.getExcelPath().toAbsolutePath().toString());
    }

    /**
     * 创建常规单表结构
     *
     * @author liusonglin
     * @date 2018年7月25日
     * @param tables 多章表数据集合
     * @param dto 传输对象
     */
    public static void createSingleDbExcel(List<TableInfo> tables, DbTableDto dto){
        if(StringUtils.isEmpty(dto.getExcelPath())) {
            throw new RuntimeException("未输入导出文件名");
        }
        if(!Files.exists(dto.getExcelPath().getParent())){
            throw new RuntimeException("文件路径不存在");
        }
        HSSFWorkbook oldWb=new HSSFWorkbook();
        oldWb = FileUtils.fnInputStream(dto.getExcelPath(),(fis)->{
            HSSFWorkbook oldWb2=new HSSFWorkbook(fis);
            return oldWb2;
        });

        if(oldWb!=null){
            HSSFSheet sheet = oldWb.getSheet(dto.getSheetName());
            if( sheet != null ){
                System.out.println("该sheet已经存在:"+dto.getSheetName());
                return;
            }
        }

        String[][] content = new String[tables.size()][dto.getExcelTitle().length];

        for (int i = 0; i < tables.size(); i++) {
            TableInfo ColInfo = tables.get(i);
            content[i][0] = ColInfo.getTableName();
            content[i][1] = ColInfo.getTableComment();
        }

        // 创建HSSFWorkbook
        HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook( dto.getSheetName(), dto.getExcelTitle(),
                content, oldWb );

        // 响应到客户端
        try {
            OutputStream os = new FileOutputStream(dto.getExcelPath().toFile());
            wb.write(os);
            os.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        System.out.println("输出路径成功:"+dto.getExcelPath().toAbsolutePath().toString());
    }

    /**
     * 创建常规单表结构
     *
     * @author liusonglin
     * @date 2018年7月25日
     * @param dto 传输对象
     */
    public static  void createExcel(ExcelDto dto){
        List<List> data=dto.getList();
        if(StringUtils.isEmpty(dto.getExcelPath())) {
            throw new RuntimeException("未输入导出文件名");
        }
        if(!Files.exists(dto.getExcelPath().getParent())){
            throw new RuntimeException("文件路径不存在");
        }
        HSSFWorkbook oldWb=new HSSFWorkbook();
        oldWb = FileUtils.fnInputStream(dto.getExcelPath(),(fis)->{
            HSSFWorkbook oldWb2=new HSSFWorkbook(fis);
            return oldWb2;
        });

        if(oldWb!=null){
            HSSFSheet sheet = oldWb.getSheet(dto.getSheetTitle());
            if( sheet != null ){
                System.out.println("该sheet已经存在:"+dto.getSheetTitle());
                return;
            }
        }

        String[][] content = new String[dto.getList().size()][dto.getExcelTitle().length];

        for (int i = 0; i < data.size(); i++) {
            List rowData  = data.get(i);
            /*content[i][0] = ColInfo.getTableName();
            content[i][1] = ColInfo.getTableComment();*/
            for (int j = 0; j < rowData.size(); j++) {
                content[i][j]=rowData.get(j)+"";
            }
        }

        // 创建HSSFWorkbook
        HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook( dto.getSheetTitle(), dto.getExcelTitle(),
                content, oldWb );

        // 响应到客户端
        try {
            OutputStream os = new FileOutputStream(dto.getExcelPath().toFile());
            wb.write(os);
            os.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        System.out.println("输出路径成功:"+dto.getExcelPath().toAbsolutePath().toString());
    }
    
}
